package com.example.domain.dto;

import com.example.domain.valueobject.Money;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.math.BigDecimal;

/**
 * 金额传输对象
 * 用于API响应中的金额字段
 * 
 * @author Means
 * @since 2025-10-27
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(JsonInclude.Include.NON_NULL)
public class MoneyDTO {
    
    /**
     * 金额值（保留2位小数，用于展示）
     * 示例: "99.50"
     */
    private BigDecimal amount;
    
    /**
     * 货币符号
     * 示例: "¥", "$", "€"
     */
    private String currency;
    
    /**
     * 格式化后的金额字符串（可选）
     * 示例: "¥99.50"
     */
    private String formatted;
    
    /**
     * 从Money值对象创建DTO
     * 
     * @param money 金额值对象
     * @return MoneyDTO
     */
    public static MoneyDTO from(Money money) {
        if (money == null) {
            return null;
        }
        return MoneyDTO.builder()
                .amount(money.getDisplayAmount())
                .currency(money.getCurrency().getSymbol())
                .formatted(money.format())
                .build();
    }
    
    /**
     * 转换为Money值对象
     * 
     * @return Money值对象
     */
    public Money toMoney() {
        return Money.of(this.amount);
    }
    
    /**
     * 创建简单的金额DTO（仅包含金额和货币符号）
     * 
     * @param money 金额值对象
     * @return MoneyDTO
     */
    public static MoneyDTO simple(Money money) {
        if (money == null) {
            return null;
        }
        return MoneyDTO.builder()
                .amount(money.getDisplayAmount())
                .currency(money.getCurrency().getSymbol())
                .build();
    }
    
    /**
     * 创建零金额
     * 
     * @return 零金额DTO
     */
    public static MoneyDTO zero() {
        return MoneyDTO.builder()
                .amount(BigDecimal.ZERO)
                .currency("¥")
                .formatted("¥0.00")
                .build();
    }
}

